/**
* Sony Vegas Pro (10) audio exchange script to export current project to simplified Adobe Audition .sesx format.
*
* Hacked together from the EDL export example by Jarno Elonen
* 2011-12-03
**/
import System;
import System.Text;
import System.IO;
import System.Windows.Forms;
import Sony.Vegas;
var writer : StreamWriter = null;
var nextClipId = 0;
var eventIdx = 0;
var fileToClipInfoTable = Array();
var accumulatedErrors = "";
var sesxSampleRate = 48000;
try {
var noTime = new Timecode();
// find selected tracks
var audioTrack = FindTrackNOfType(MediaType.Audio,0);
if (null == audioTrack) {
throw "no selected audio tracks to export";
}
var projPath = Vegas.Project.FilePath;
var title = Path.GetFileNameWithoutExtension(projPath);
var outputFilename = Path.ChangeExtension(projPath, ".sesx");
var outputFilename = ShowSaveFileDialog("Audition session Files (*.SESX)|*.SESX", "Save SESX", title);
if (null != outputFilename) {
writer = new StreamWriter(outputFilename, false, System.Text.Encoding.UTF8, 512);
var projLen = Vegas.Project.Length.ToMilliseconds()/1000.0*sesxSampleRate;
writer.WriteLine('');
writer.WriteLine('');
writer.WriteLine('');
writer.WriteLine(' ');
writer.WriteLine(' ' + title + '' );
writer.WriteLine(' ' );
// do audio tracks
var n=0;
var audioTrack = FindTrackNOfType(MediaType.Audio,n);
while ( null != audioTrack )
{
for ( var chan=0; chan<=1; chan++ )
{
writer.WriteLine(' ');
writer.WriteLine(' ');
if ( chan==0 )
writer.WriteLine(' ' + audioTrack.Name + '.L');
else
writer.WriteLine(' ' + audioTrack.Name + '.R');
writer.WriteLine(' ');
writer.WriteLine(' ');
writer.WriteLine(' ');
writer.WriteLine(' ');
writer.WriteLine(' ');
ExportTrack(new Enumerator(audioTrack.Events), chan);
writer.WriteLine(' ');
}
n++;
audioTrack = FindTrackNOfType(MediaType.Audio,n);
}
writer.WriteLine(' ');
writer.WriteLine(' ');
writer.WriteLine(' Master');
writer.WriteLine(' ');
writer.WriteLine(' ');
writer.WriteLine(' ');
writer.WriteLine(' ');
writer.WriteLine(' ');
writer.WriteLine(' ');
writer.WriteLine(' ');
writer.WriteLine(' ');
writer.WriteLine(' ');
writer.WriteLine(' ');
writer.WriteLine(' ');
writer.WriteLine(' ');
writer.WriteLine('');
for (var filename in fileToClipInfoTable)
{
var clipinfo = fileToClipInfoTable[filename];
writer.WriteLine('');
}
writer.WriteLine('');
writer.WriteLine('');
writer.Close();
}
} catch (e) {
if (null != writer)
writer.Close();
MessageBox.Show(e);
}
if ( accumulatedErrors != "" ) {
MessageBox.Show("Errors:\n" + accumulatedErrors);
}
function ExportTrack(events, chan)
{
var currentEvent = events.item();
try
{
while ( !events.atEnd())
{
currentEvent = events.item();
var activeTake = currentEvent.ActiveTake;
var mediaPath = activeTake.MediaPath
var media = Vegas.Project.MediaPool[mediaPath];
var tapeName = GetTapeName(media);
var trackType = GetTrackType(currentEvent);
var sourceIn = media.TimecodeIn + activeTake.Offset;
var timelineIn = currentEvent.Start;
var clipLength = currentEvent.Length;
var filename = Path.GetFullPath(mediaPath);
var clipInfo = fileToClipInfoTable[filename];
if ( !clipInfo )
{
clipInfo = Array();
clipInfo['id'] = nextClipId;
nextClipId++;
clipInfo['filenameonly'] = Path.GetFileName(mediaPath);
fileToClipInfoTable[filename] = clipInfo;
}
var srcInSamples = (int)(sourceIn.ToMilliseconds() / 1000.0 * sesxSampleRate);
var inSamples = (int)(timelineIn.ToMilliseconds() / 1000.0 * sesxSampleRate);
var lenSamples = (int)(clipLength.ToMilliseconds() / 1000.0 * sesxSampleRate);
writer.WriteLine(' ');
writer.WriteLine(' ');
writer.WriteLine(' ');
//writer.WriteLine(' ');
writer.WriteLine(' ');
writer.WriteLine(' ');
eventIdx++;
events.moveNext();
}
return;
/*
// compute parameters for current event
var activeTake = currentEvent.ActiveTake;
var mediaPath = activeTake.MediaPath
var media = Vegas.Project.MediaPool[mediaPath];
var tapeName = GetTapeName(media);
var trackType = GetTrackType(currentEvent);
if ( trackIdx > 0 )
trackType = "NONE ";
var sourceIn = media.TimecodeIn + activeTake.Offset;
var timelineIn = currentEvent.Start;
var clipLength = currentEvent.Length;
*/
/*
if (null != nextEvent) {
clipLength -= nextEvent.FadeIn.Length;
}
if (null != prevMediaPath) {
var frameCount = currentEvent.FadeIn.Length.FrameCount;
WriteEdit(editIndex, tapeName, trackType, "D", frameCount, sourceIn, timelineIn, clipLength);
WriteClipComment("FROM", prevMediaPath);
WriteClipComment("TO", mediaPath);
} else {
WriteEdit(editIndex, tapeName, trackType, "C", 0, sourceIn, timelineIn, clipLength);
WriteClipComment("FROM", mediaPath);
}
if ( trackIdx > 0 )
writer.WriteLine("AUD " + (trackIdx+2) + " ");
// add comments for altered playback rates, etc. (may want to add
// comments for inverted phase, channel remapping, looping, etc.
if (currentEvent.PlaybackRate != 1) {
writer.WriteLine("* Event PlaybackRate = " + currentEvent.PlaybackRate);
}
if (currentEvent.IsVideo()) {
if (currentEvent.Envelopes.HasEnvelope(EnvelopeType.Velocity)) {
writer.WriteLine("* Event has velocity envelope.");
}
}
*/
/*
if (null != nextEvent) {
var frameCount = nextEvent.FadeIn.Length.FrameCount;
if (frameCount > 0) {
sourceIn += clipLength;
timelineIn += clipLength;
WriteEdit(editIndex+1, tapeName, trackType, "C", 0, sourceIn, timelineIn, noTime);
return ExportTrack(events, editIndex+1, mediaPath, trackIdx);
}
}
*/
}
catch(e)
{
if ( currentEvent )
accumulatedErrors += "Warning: ignored error ar time " + currentEvent.Start + ": " + e + "\n";
else
accumulatedErrors += "Error: " + e + "\n";
}
//return ExportTrack(events, editIndex+1, null, trackIdx);
}
// assumes all audio is stereo
function GetTrackType(evnt) {
// "V/AAAA"
if (evnt.IsVideo()) return "V ";
return "AA ";
}
function GetTapeName(media) {
var tapeName = media.TapeName;
if ((null == tapeName) || (0 == tapeName.length)) {
tapeName = "UNKNOWN";
}
// strip spaces (really should be any non-alphanumeric characters)
if (null != tapeName.match(/ /)) {
tapeName = tapeName.replace(/ /g, "");
}
if (tapeName.length > 8) {
// tape name is too long... chop off the end
tapeName = tapeName.substring(0, 8);
}
return tapeName;
}
function WriteEdit(editIndex, tapeName, trackType, editType, frameCount, sourceIn, timelineIn, clipLength) {
var edit : StringBuilder = new StringBuilder();
edit.Append("\n");
edit.Append(String.Format("{0:D3}", editIndex));
edit.Append(" ");
edit.Append(tapeName);
edit.Append(" ");
edit.Append(trackType);
edit.Append(" ");
edit.Append(editType);
edit.Append(" ");
if (frameCount > 0) {
edit.Append(String.Format("{0:D3}", frameCount));
//edit.Append(frameCount);
edit.Append(" ");
} else {
edit.Append(" ");
}
edit.Append(sourceIn.ToString());
edit.Append(" ");
var sourceOut = sourceIn + clipLength;
edit.Append(sourceOut.ToString());
edit.Append(" ");
edit.Append(timelineIn.ToString());
edit.Append(" ");
var timelineOut = timelineIn + clipLength;
edit.Append(timelineOut.ToString());
writer.WriteLine(edit.ToString());
}
function WriteClipComment(prefix, mediaPath) {
var c = new StringBuilder("* ");
c.Append(prefix);
c.Append(" CLIP NAME: ");
c.Append(Path.GetFileName(mediaPath));
writer.WriteLine(c.ToString());
}
function GetFCM() : String {
var rulerFormat = Vegas.Project.Ruler.Format;
switch (rulerFormat) {
case RulerFormat.SmpteDrop:
return "DROP FRAME";
case RulerFormat.SmpteFilmSync:
case RulerFormat.SmpteFilmSyncIVTC:
return "NON-DROP 24 FRAME";
default:
return "NON-DROP FRAME";
}
}
function FindTrackNOfType(mediaType, n) : Track {
var trackEnum = new Enumerator(Vegas.Project.Tracks);
while (!trackEnum.atEnd()) {
var track : Track = Track(trackEnum.item());
if (track.MediaType == mediaType) {
if ( n==0 )
return track;
else
n--;
}
trackEnum.moveNext();
}
return null;
}
// an example filter: "PNG File (*.png)|*.png|JPEG File (*.jpg)|*.jpg"
function ShowSaveFileDialog(filter, title, defaultFilename) {
var saveFileDialog = new SaveFileDialog();
if (null == filter) {
filter = "All Files (*.*)|*.*";
}
saveFileDialog.Filter = filter;
if (null != title)
saveFileDialog.Title = title;
saveFileDialog.CheckPathExists = true;
saveFileDialog.AddExtension = true;
if (null != defaultFilename) {
var initialDir = Path.GetDirectoryName(defaultFilename);
if (Directory.Exists(initialDir)) {
saveFileDialog.InitialDirectory = initialDir;
}
saveFileDialog.DefaultExt = Path.GetExtension(defaultFilename);
saveFileDialog.FileName = Path.GetFileName(defaultFilename);
}
if (System.Windows.Forms.DialogResult.OK == saveFileDialog.ShowDialog()) {
return Path.GetFullPath(saveFileDialog.FileName);
} else {
return null;
}
}